/*
 * Thread.h
 *
 *  Created on: 2011/07/02
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_THREADING_THREAD_H
#define INCLUDED_NTENGINE_THREADING_THREAD_H

namespace NTEngine {
namespace Threading {

/**
 * @brief スレッドのベースクラスです。
 *       operator()()を実装してください。
 *       デストラクトするまえにjoinすること
 */
class Thread {
public:
	/**
	 * @brief スレッドの実行関数です。継承先で実装してください。
	 */
	virtual void operator()() = 0;

	/**
	 * @brief スレッドを開始します。実行中なら終了をまってから再度開始します。
	 */
	void start();

	/**
	 * @brief 終了を待ちます。
	 */
	void join();

	/**
	 * @brief スレッドが終了したか問い合わせます。
	 * @return [bool] true:スレッド完了 false:スレッドはまだ実行中
	 */
	bool isFinished();

	Thread();
protected:
	~Thread();

private:
	class Impl;
	Impl* mImpl;
};

} // namespace Threading
} // namespace NTEngine

#endif // INCLUDED_NTENGINE_THREADING_THREAD_H
